package persistencia.busqueda;

import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import negocio.administracion.Empleado;
import negocio.busqueda.SeguimientoCandidato;
import negocio.cliente.Cliente;
import negocio.cliente.SolicitudRRHH;
import negocio.cv.Puesto;
import persistencia.DACBase;
import persistencia.SingletonDACBase;
import persistencia.cliente.DACCliente;
import persistencia.cliente.DACPuesto;
import Excepciones.ExccepcionFormeteoDeFechas;

public class DACSolicitudRRHH extends DACBase {

	private SolicitudRRHH solicitud;
	private List<SolicitudRRHH> solicitudes;
	private CallableStatement clstm;
	private ResultSet rs;
	
	public DACSolicitudRRHH(DACBase dacBase){
		super( dacBase);
	}
	
	public void altaSolicitudRRHH(List<SolicitudRRHH> solicitudes){
		
			
		
		try{	
			for (SolicitudRRHH solicitud : solicitudes) {
				clstm = getConn().prepareCall("{ ? = call save_solicitudrrhh(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");			
				clstm.registerOutParameter(1,java.sql.Types.INTEGER);
				
				clstm.setInt("idsolicitudrrhh", solicitud.getIdSolicitudRRHH());
				clstm.setInt("idcliente",solicitud.getCliente().getIdCliente());
				//Luego usamos el legajo del usuario
				//Empleado e = (Empleado)solicitud.getEmpleadoQueRegistro();
				clstm.setInt("legajo", 1);
				clstm.setInt("idpuesto", solicitud.getPuesto().getIdPuesto());
				// pasamos la fecha al formato string que permite pasarlo a la base
				SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd");
				clstm.setString("fecharecepcion", sdformat.format(solicitud.getFechaRecepcion()));
				if (solicitud.getEstado().equals("nueva")) {
					solicitud.setEstado("pendiente");					
				}
				clstm.setString("estado", solicitud.getEstado());
				clstm.setInt("empleadossolicitados", solicitud.getCantEmpleadosSolictados());
				clstm.setString("fechaprevistasolucion", sdformat.format(solicitud.getFechaPrevistaSolucion()));			
				clstm.setInt("empleadosprovistos", solicitud.getCantEmpleadosProvistos());
				clstm.setString("rutaarchivo", solicitud.getRutaArchivo());
				clstm.setString("observaciones", solicitud.getObservacion());			
				clstm.execute();
				
				if (solicitud.getIdSolicitudRRHH() == 0) {
					solicitud.setIdSolicitudRRHH(clstm.getInt(1));
				}
				
			}			
			clstm.close();
	        clstm = null;
	         
	       
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo altaSolicitudRRHH_DacSolicitud");
		}		
		
	}
	
	public List<SolicitudRRHH> consultaSolicitudesPendientes() throws ExccepcionFormeteoDeFechas{		
		solicitudes = new ArrayList<SolicitudRRHH>();		
		try{
			clstm = getConn().prepareCall("{call solicitudRRHHConsultarPendientes()}"); 
			clstm.execute();
			rs = clstm.getResultSet();			
			while (rs.next()) {
				 solicitud = new SolicitudRRHH();		     
			     solicitud.setIdSolicitudRRHH(rs.getInt("idsolicitudrrhh"));
			     
			     //consulto el cliente por su nro
			     DACCliente dacCliente = new DACCliente(SingletonDACBase.tomarDACBase());
			     Cliente c = dacCliente.consultarCliente(rs.getInt("idcliente"));
				 solicitud.setCliente(c);
				 
				 Empleado em = new Empleado();
				 em.setLegajo(rs.getInt("legajo"));				 
				 solicitud.setEmpleadoQueRegistro(em);
				 
				 //consulto el puesto por su numero
				 DACPuesto dacPuesto = new DACPuesto(SingletonDACBase.tomarDACBase());				 
				 Puesto p = dacPuesto.consultarPuesto(rs.getInt("idpuesto"));
				 solicitud.setPuesto(p);
				 
				 SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd");
				 try {
					 solicitud.setFechaRecepcion(sdformat.parse(rs.getString("fecharecepcion")));
					 
					 solicitud.setFechaPrevistaSolucion(sdformat.parse(rs.getString("fechaprevistasolucion")));					 
					 //solicitud.setFechaRealSolucion(sdformat.parse(rs.getString("fecharealsolucion")));
					 
				} catch (Exception e) {
					// TODO: handle exception
					throw new ExccepcionFormeteoDeFechas();
				}
				
				 solicitud.setEstado(rs.getString("estado"));
				 solicitud.setCantEmpleadosSolictados(rs.getInt("empleadossolicitados"));				 
				 solicitud.setCantEmpleadosProvistos(rs.getInt("empleadosprovistos"));
				 solicitud.setRutaArchivo(rs.getString("rutaarchivo"));
				 solicitud.setObservacion(rs.getString("observaciones"));				 
				 
				 solicitudes.add(solicitud);
            }			           

			rs.close();
			rs = null;
			clstm.close();
            clstm = null;            
		}    
		catch (SQLException ex) {
		    // handle any errors
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo consultaSolicitudesPendientes()_DacSolicitud");
			}
		
	    return solicitudes;		
	}
	
	/**
	 * modifica el estado de la solicitud
	 *
	 */
	public void modificarEstadoSolicitud(SolicitudRRHH solicitud) {
		try{	
			clstm = getConn().prepareCall("{call solicitudModificarEstado(?, ?)}");
					
			clstm.setInt("id",solicitud.getIdSolicitudRRHH());
			clstm.setString("estado", solicitud.getEstado());			
			
			clstm.execute();  
			clstm.close();
	        clstm = null;    
	           	            
	        
		}
		
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo olicitudModificarEstado_DacSolicitud");
		}		
		
	}

	public void eliminarSolicitudes(ArrayList<SolicitudRRHH> solicAEliminar) {
		try {
			for (SolicitudRRHH solicitud : solicAEliminar) {
				if (solicitud.getIdSolicitudRRHH() != 0) {
					clstm = getConn().prepareCall("{ call delete_solicitud(?) }");
					clstm.setInt("id", solicitud.getIdSolicitudRRHH());					
					clstm.execute();
					
					DACPerfil dacPerfil = new DACPerfil(SingletonDACBase.tomarDACBase());
					solicitud.setPerfil(dacPerfil.consultarPerfil(solicitud.getIdSolicitudRRHH()));
					if (solicitud.getPerfil() != null) {
						dacPerfil.eliminarPerfil(solicitud.getPerfil());
					}
				}
			}
		}
		catch (SQLException ex) {
		    // handle any errors			
		    System.out.println("SQLException: " + ex.getMessage());
		    System.out.println("SQLState: " + ex.getSQLState());
		    System.out.println("VendorError: " + ex.getErrorCode());
		    System.out.println("Error en metodo eliminarSolicitudes_DacSolicitud");
		}	
		solicAEliminar = null;	
		
	}
}
